package cn.icare.cms.aliyunsdk;

import cn.icare.cms.config.AliyunConfig;
import com.aliyun.oss.OSSClient;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.RandomUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.Date;

@Service
public class UploadPicService {
    // 允许上传的格式
    private static final String[] IMAGE_TYPE = new String[]{".bmp", ".jpg", ".jpeg", ".gif", ".png"};

    @Autowired
    private OSSClient ossClient;

    @Autowired
    private AliyunConfig aliyunConfig;

    public PicUploadResult upload(MultipartFile multipartFile,String kindName) {
        // 1. 对上传的图片进行校验: 这里简单校验后缀名
        // 另外可通过ImageIO读取图片的长宽来判断是否是图片,校验图片的大小等。
        // TODO 图片校验
        boolean isLegal = false;
        for (String type : IMAGE_TYPE) {
            if (StringUtils.endsWithIgnoreCase(multipartFile.getOriginalFilename(), type)) {
                isLegal = true;
                break;  // 只要与允许上传格式其中一个匹配就可以
            }
        }
        PicUploadResult picUploadResult = new PicUploadResult();
        // 格式错误, 返回与前端约定的error
        if (!isLegal) {
            picUploadResult.setError("上传图片格式不支持");
            picUploadResult.setSuccess(false);
            return picUploadResult;
        }

        // 2. 准备上传API的参数
        String fileName = multipartFile.getOriginalFilename();
        String filePath = this.getFilePath(fileName,kindName);

        // 3. 上传至阿里OSS
        try {
            ossClient.putObject(aliyunConfig.getBucketName(), filePath, new ByteArrayInputStream(multipartFile.getBytes()));
        } catch (IOException e) {
            e.printStackTrace();
            // 上传失败
            picUploadResult.setSuccess(false);
            picUploadResult.setError("上传到阿里OSS发生异常："+e.getMessage());
            return picUploadResult;
        }

        // 上传成功
        picUploadResult.setSuccess(true);
        // 文件名(即直接访问的完整路径)
        picUploadResult.setPicUrl(aliyunConfig.getUrlPrefix() + filePath);
        return picUploadResult;
    }

    /**
     * 上传的目录
     * 目录: 根据年月日归档
     * 文件名: 时间戳 + 随机数
     * @param fileName
     * @param kindName 分类名称，用来区分图片用途
     * @return
     */
    private String getFilePath(String fileName,String kindName) {
       Date date= new java.util.Date();
        String saveFileName = new java.text.SimpleDateFormat("yyyyMMddHHmmSS").format(date)
                +"."+ RandomUtils.nextInt(9999) + "." + StringUtils.substringAfterLast(fileName, ".");;
        String saveDirName=kindName+"/"+new java.text.SimpleDateFormat("yyyy/MM/dd").format(date);
        return saveDirName+"/"+saveFileName;

    }
}
